CMU 15619 Cloud Computing 的 individual project,项目全名是 Social Networking Timeline with Heterogeneous Back-ends,通过 MySQL/HBase/MongoDB 实现简化版 twitter 的后端。
Implementing Basic Login with MySQL on RDS
AWS RDS 配置 MySQL 并导入 users.csv and userinfo.csv 数据集,
数据集:
- users.csv [UserID, Password]
- userinfo.csv [UserID, Name, Profile Image URL]
如果用户名密码正确,返回 user name and Profile Image Url,
如果不正确,name 返回 “Unauthorized”,Profile Image URL 返回 “#”.
Request:
GET /task1?id=[UserID]&pwd=[Password]
Response:
returnRes({"name":"my_name", "profile":"profile_image_url"})
效果:
Storing Social Graph using HBase
数据集:
- links.csv [Followee, Follower]
对 followers 进行排序。排序规则:
- 按姓名进行升序排序
- 按 Profile Image URL 进行升序排序
实现:
从 HBase 中根据 userid 找出 followers,再从 MySQL 中根据 follower userid 找出 name 和 profile url 并进行排序。
这里的问题是 HBase 的表如何设计能最大化性能。可以采用的方式为:
对数据集进行处理,按 followee 排序然后按 followers 排序,并进行合并,得到 [Followee, FollowerList],followee 作为 rowkey。
Request:
GET /task2?id=[UserID]
Response:
{"followers":[{"name":"follower_name_1", "profile":"profile_image_url_1"}, {"name":"follower_name_2", "profile":"profile_image_url_2"}, ...]}
Build Homepage using MongoDB
同样是对 HBase 表的设计。这里要求的是根据 userid 找到 followees,然后再找到 followees 的 posts。为了提高性能,可以做的是:
对数据集进行处理,按 follower 排序然后按 followees 排序,并进行合并,得到 [Follower, FolloweeList]
数据集:
posts.csv
{
“pid”:xxx, // PostID
“uid”:xxx, // UserID of poster
“name”:”xxx”, // User name of poster
“profile”:”xxx”, // Poster profile image URL
“timestamp”:”YYYY-MM-DD HH:MM:SS”, // When post is posted
“image”:”xxx”, // Post image
“content”:”xxx”, // Post text content
“comments”:[ // comments json array
{
“uid”:xxx, // UserID of commenter
“name”:”xxx”, // User name of commenter
“profile”:”xxx”, // Commenter profile image URL
“timestamp”:”YYYY-MM-DD HH:MM:SS”, // When comment is made
“content”:”xxx” // Comment text content
},
{
“uid”:xxx,
…….
},
……
]
}
Request:
GET /task3?id=[UserID]
Response:
{"posts":[{post1_json}, {post2_json}, ...]}
Put Everything Together
显示 user 关注的人的最新 30 篇 posts
排序规则:
对 followers 进行排序。排序规则:
- 按姓名进行升序排序
- 按 Profile Image URL 进行升序排序
对最新 30 篇 posts 排序:
- 按 timestamp 升序排序
- 按 pid (PostID) 升序排序
不满 30 篇 posts 返回全部。
Sample Request:
http://backend-public-dns:8080/MiniSite/task4?id=99
Sample Response:
Basic Recommendation
根据 userid 推荐 10 个 user。
算法: 基于用户的协同过滤算法。
Eg.
assume A follows {B, C, D}.
Followee B follows {C, E, A},
followee C follows {F, G} and
followee D follows {G, H}.
得分:{G: 2, E: 1, F: 1, H: 1}
排序规则:
- 按得分降序排序
- 按 user id 升序排序
少于 10 个用户返回全部。
Request:
GET /task2?id=[UserID]
Response:
returnRes({"recommendation":[{name:, profile: },{name: , profile: },...,{name: , profile: ]})